上上一篇稍微聊了 auto
的「基本面」,僅說明其對程式碼語法的影響,這一篇要講 auto
的「語義」。首先,再複習一次 auto
的定義:
For variables, specifies that the type of the variable that is being declared will be automatically deduced from its initializer.
使用 auto
來定義變數,其變數型別「由其 initializer(暫時想不到合適的中譯)決定(編譯時期)」。這也暗示了,使用 auto
定義變數,「不會有變數沒有初始化就被使用」的臭蟲。考慮以下程式碼:
int i;
auto x = 1 + 2.0;
i
沒有被明確初始化,其值未知,若冒然使用,程式執行結果也未知(不定時炸彈)。相反地,由於 auto
必須透過 initializer 來推導其型別,因此,不會出現「變數值沒有初始化即拿來使用的問題」。上述 auto
若等號右邊沒有指定算式(Expression)或數值,那麼編譯器會報錯。因此,auto
帶來的語義為:
使用
auto
宣告的變數必定有初始值。
auto
的另一個功能是確保程式碼正確性。考慮以下程式:
std::vector<int> v;
unsigned int sz = v.size();
v.size()
的回傳型別應該是 std::vector<int>::size_type
,但過於冗長,而且,就算有 IDE 輔助,也需要打不少字,因此,常見手法是用 unsigned int
接住,但也因此「養了一隻臭蟲」。
上述程式編譯成 32-bit 版本,std::vector<int>::size_type
為 32-bit(4-byte);若編譯成 64-bit,則為 64-bit(8-byte)。因此,在 64-bit 的系統上運行,v.size()
的值有可能超過 unsigned int
最大值。使用 auto
可以避免這種情況:
std::vector<int> v;
auto sz = v.size();
所以說,要跟 auto
當好朋友。